package com.reliable.service.utils;

import cn.hutool.crypto.Mode;
import cn.hutool.crypto.Padding;
import cn.hutool.crypto.symmetric.AES;

import java.nio.charset.StandardCharsets;
import java.util.Scanner;

/**
 * 银行卡数据解密工具
 * 专门用于解密从CSV文件中导出的加密银行卡数据
 */
public class BankCardDecryptor {

    // 与导出银行卡数据时使用的相同密钥
    private static final String KEY = "bank:#h^U780^5g%";
    
    // AES解密器
    private static final AES aes = new AES(Mode.ECB, Padding.PKCS5Padding, KEY.getBytes(StandardCharsets.UTF_8), null);

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.println("=== 银行卡数据解密工具 ===");
        System.out.println("使用密钥: " + KEY);
        System.out.println("加密模式: ECB");
        System.out.println("填充方式: PKCS5Padding");
        System.out.println("输入 'exit' 退出程序");
        
        // 显示示例
        demonstrateEncryptionDecryption();

        while (true) {
            System.out.print("\n请输入要解密的内容 (16进制格式): ");
            String encryptedData = scanner.nextLine();

            if ("exit".equalsIgnoreCase(encryptedData.trim())) {
                System.out.println("程序退出");
                break;
            }

            if (encryptedData.trim().isEmpty()) {
                System.out.println("输入内容不能为空");
                continue;
            }

            // 移除可能存在的空格和换行符
            encryptedData = encryptedData.trim().replaceAll("\\s+", "");
            
            try {
                // 验证输入是否为有效的十六进制字符串
                if (!isValidHex(encryptedData)) {
                    System.out.println("错误: 输入不是有效的十六进制字符串");
                    continue;
                }
                
                // 尝试解密
                String decryptedData = aes.decryptStr(encryptedData);
                System.out.println("解密结果: " + decryptedData);
            } catch (Exception e) {
                System.out.println("解密失败: " + e.getMessage());
                System.out.println("请确保输入的是有效的AES加密数据");
                
                // 提供调试信息
                System.out.println("\n调试信息:");
                System.out.println("- 输入长度: " + encryptedData.length() + " 字符");
                if (encryptedData.length() % 32 != 0) {
                    System.out.println("- 警告: 十六进制字符串长度通常应为32的倍数（AES块大小为16字节）");
                }
            }
        }

        scanner.close();
    }
    
    /**
     * 演示加密解密过程
     */
    private static void demonstrateEncryptionDecryption() {
        System.out.println("\n=== 演示示例 ===");
        String testData = "6222001234567890"; // 示例银行卡号
        try {
            String encrypted = aes.encryptHex(testData);
            String decrypted = aes.decryptStr(encrypted);
            System.out.println("原始数据: " + testData);
            System.out.println("加密结果: " + encrypted);
            System.out.println("解密结果: " + decrypted);
            System.out.println("解密是否正确: " + testData.equals(decrypted));
        } catch (Exception e) {
            System.out.println("演示过程中出现错误: " + e.getMessage());
        }
    }
    
    /**
     * 检查字符串是否为有效的十六进制字符串
     */
    private static boolean isValidHex(String hex) {
        return hex.matches("^[0-9a-fA-F]+$");
    }
}